package com.gaojinqi.base.common.service;

import com.gaojinqi.base.common.exception.BizRuntimeException;
import com.gaojinqi.base.common.model.PageReq;
import com.gaojinqi.base.common.model.PageResp;
import com.gaojinqi.base.common.util.PageUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;

import java.io.Serializable;
import java.util.List;
import java.util.function.Supplier;

/**
 * 通用service接口
 *
 * @author gaojinqi
 * @version 1.0
 * @since 2020年04月09日
 */
public interface BaseService<T, ID extends Serializable> {

    /**
     * 查找对象
     *
     * @throws BizRuntimeException
     */
    T findById(ID id);

    /**
     * 保存对象，null字段将不被录入
     */
    void save(T entity);

    /**
     * 更新对象，null字段将不被录入
     */
    void update(T entity);

    /**
     * 根据对象id删除对象（单表操作）
     */
    void deleteById(ID id);

    /**
     * 批量删除
     */
    void deleteByIds(List<ID> ids);

    /**
     * 分页查询
     */
    PageResp<T> page(Object entity);

    /**
     * 单表分页查询（支持传入检索条件及多字段排序）<br>
     * <b>注意：</b><br>
     * 1、字符串模糊搜索，其他类型数据精确搜索。<br>
     * 2、仅适用于单表全字段检出情况。
     * 3、如果是BaseEntity的子类，并且没有设置排序字段，则默认使用BaseEntity#DEFAULT_SORT_BY
     */
    PageResp<T> page(Object entity, PageReq pageReq, Sort.Order... order);

}